// 為了增加豐富性,這邊接著增加 雜貨店 及 雜貨店老闆 兩個結構
struct Grocery has key { id:UID, profits:Balance<SUI> } //雜貨店
struct GroceryOwnerCapability has key { id:UID } //雜貨店老闆
雜貨店的結構中,有加入一個profits,代表雜貨店在賣了火腿跟麵包後,會將賺來的錢放在這裡。
這邊有將profits定義類型為 Balance,這裡所使用的Token為SUI。
因為有用到新的類型,所以要在上面加入 use sui::balance::Balance;
// 常數部分 則接著新增錯誤訊息
const EInsufficientFunds: u64 = 001; //購買時,金額不足
const ENoProfits: u64 = 002; //老闆要從雜貨店領錢時,雜貨店沒有錢
錯誤代碼的名稱表現可以在敘述前加上E,有些也會將其完整呈現
如: Error_No_Profits ,這就依照個人喜好。
以上這些部分,在個人編寫時,也不一定是一次寫完,可以先把有用到的先編寫,等後續如果有要用到不同的結構或函數,以及調用,再來補上也可以。
在把所需要的結構及常數建立完成後,接下來開始編寫函數的部分。
module sandwich::shop {
use sui::object::UID;
use sui::balance::Balance;
struct Ham has key { id:UID }
struct Bread has key { id:UID }
struct Sandwich has key { id:UID }
struct Grocery has key { id:UID, profits:Balance<SUI> }
struct GroceryOwnerCapability has key { id:UID }
const HAM_PRICE: u64 = 10;
const BREAD_PRICE: u64 = 2;
const EInsufficientFunds: u64 = 001;
const ENoProfits: u64 = 002;
//函數
fun init(ctx: &mut TxContext) {
transfer::share_object(
Grocery{id:object::new(ctx),
profits:balance::zero<SUI>()});
transfer::transfer(
GroceryOwnerCapability {id:object::new(ctx)},tx_context::sender(ctx));
}
在sui中,使用初始一次性執行,都以init命名為主。init多半用於賦予合約部署錢包權限,讓其有權限對此合約進行操作。
後面(),為這個函數中,有需要從外部引用 結構、常數、手動輸入值 等...時,要在()內填入。
首先 ctx 是指引用物件時,我們給他一個函數中所使用的替代物,名稱可依照個人編譯習慣命名,以全小寫為主。
&mut是引用的意思,依帶入參數的用途不同而調整,有2種: